package game.source.ships;

import game.source.gui.hud.PlayerLife;
import game.source.gui.ship.GuiPlayerShip;
import game.source.shot.GuiShotInterface.Level;
import game.source.shot.GuiShotInterface.Shooter;
import game.source.util.InputListener;
import game.source.util.Time;
import game.source.util.Timer;
import game.source.util.TimerListener;
import game.source.util.TrackerPlayer;

import java.awt.Point;

/**
 * PlayerShip:
 * 	Armazena as informações do player: pontuação, nível, número de vidas, etc..
 * 	E realiza o controle da movimentação.
 */
public final class PlayerShip extends Ship implements InputListener,TimerListener,PlayerLife{
	private int 					lifes;				//Vidas do player
	private TrackerPlayer			tracker;			//Tracker da posição do player
	private Level					level;				//Nível que o jogador está
	private Timer					timer;				//Timer para a realização do tiro no tempo
	private GuiPlayerShipIterface	ship;				//Parte gráfica especializada do player (para animação de respawn)
	private boolean 				respawn;			//Se está em respawn
	private long					t1;					//Marcação do início do respawn
	private Time					time;
	private	boolean					pause;
	private boolean					pauseTimer;
	public PlayerShip(Point position,GuiPlayerShip gui,GameInterface game,TrackerPlayer tracker){
		super(5,0,position,gui,game,600,300);
		this.lifes		= 3;
		this.tracker	= tracker;
		this.level		= Level.BASIC;
		this.respawn	= false;
		this.ship		= gui;
		this.pause		= false;
		this.pauseTimer	= true;
		this.timer		= new Timer(this,500);
		this.time		= new Time();
		this.timer.pause();
		this.timer.start();
	}
	@Override
	public void setPosition(Point position){
		super.setPosition(position);
		if(!this.respawn){
			this.tracker.updatePlayerPos(position);
		}
	}
	@Override
	public void pressed(){//Executada quando o mause é precionado
		if(!this.pause){
			this.pauseTimer = false;
			this.timer.play();
		}else{
			this.pauseTimer = false;
		}
	}
	@Override
	public void relesed(){//Executada quando o mause é solto
		this.pauseTimer = true;
		this.timer.pause();
	}

	@Override
	public void reciveFire(Level level){//Executada quando o player recebe um tiro
		super.reciveFire(level);
		if((this.time.getTime() - t1) > 3000 && !this.respawn){
			if(this.helthPoints <= 0){
				this.lifes--;
				this.gui.explosion();
				this.respawn = true;
				this.setLevel(Level.BASIC);
			}
		}
	}

	public Level getLevel(){//Retorna o nível do player
		return this.level;
	}

	public int getLifes(){//Retorna a quantidade de vidas
		return this.lifes;
	}

	public void setLevel(Level level){//Altera o nível do player, passado pelo argumento  
		switch (level) {
		case BASIC:
			this.timer.setMilisec(500);
			break;
		case MEDIUM:
			this.timer.setMilisec(250);
			break;
		case MAX:
			this.timer.setMilisec(100);
			break;
		}
		this.level = level;
	}

	public void setLifes(int lifes){//Altera a quantidade de vidas do player, passado pelo argumento
		this.lifes = lifes;
	}
	@Override
	public void update(){//Função que o timer chama para fazer os disparos em intervalos de tempo
		if(!this.respawn){
			this.game.createShot(this,Shooter.PLAYER,this.level);
		}
	}
	public void playerEnd(){
		this.timer.end();
	}
	@Override
	public void endExplosion(){
		this.gui.start(this.getPosition());
		if(this.lifes == 0){
			this.game.gameOver();
		}
		this.ship.respawn(3000);
		this.t1 = this.time.getTime();
		this.respawn = false;
	}
	@Override
	public void play() {
		super.play();
		if(this.pauseTimer == false){
			this.timer.play();
		}
		this.time.play();
		this.pause = false;
	}
	@Override
	public void pause() {
		super.pause();
		this.timer.pause();
		this.time.pause();
		this.pause = true;
	}
	@Override
	public void end(){
		super.end();
		this.timer.end();
	}
}
